package com.ly.imp;

import com.ly.rule.LyResponse;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import io.netty.util.internal.StringUtil;

import java.nio.charset.StandardCharsets;

/**
 * 同理，我们也来实现Response规范
 *
 * @author liuyang
 */
public class LyHttpResponse implements LyResponse {

    /**
     * 而这个类主要就是为了实现往通道内里面写数据，所以拿到netty中的通道
     */
    private final HttpRequest request;
    private final ChannelHandlerContext context;

    public LyHttpResponse(HttpRequest request, ChannelHandlerContext ctx) {
        this.request = request;
        this.context = ctx;
    }

    @Override
    public void write(String content) throws Exception {

        // 处理content为空的情况
        if (StringUtil.isNullOrEmpty(content)) {
            return;
        }

        // 既然我们使用了netty框架，那么我们就借用它给我们提供的类来创建响应对象
        DefaultFullHttpResponse res = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(content.getBytes(StandardCharsets.UTF_8)));

        // 设置响应头等信息
        HttpHeaders headers = res.headers();
        // 设置响应体类型
        headers.set(HttpHeaderNames.CONTENT_TYPE, "text/json");
        // 设置响应体长度
        headers.set(HttpHeaderNames.CONTENT_LENGTH, res.content().readableBytes());
        // 设置缓存过期时间
        headers.set(HttpHeaderNames.EXPIRES, 0);
        // 若HTTP请求是长连接，则响应也使用长连接
        if (HttpUtil.isKeepAlive(request)) {
            headers.set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
        }
        // 将响应写入到Channel
        this.context.writeAndFlush(res);
    }
}
